package com.tesisutn.restsoft.controladores.articulo.articuloComprado;

import java.io.IOException;
import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import com.tesisutn.restsoft.dominio.articulo.*;
import com.tesisutn.restsoft.persistencia.interfaces.dominio.*;
import com.tesisutn.restsoft.resultado.Content;
import com.tesisutn.restsoft.resultado.Result;
import com.tesisutn.restsoft.resultado.Row;
import com.tesisutn.restsoft.resultado.formatter.HTMLSelectFormatter;
import com.tesisutn.restsoft.resultado.formatter.JSONFormatter;

@Controller
@RequestMapping(value="articuloComprado")
@SessionAttributes("articuloComprado")
public class ControladorArticuloComprado {
	@Resource
	private PersistenciaArticuloComprado persistencia;
	@Resource
	private PersistenciaMarca persistenciaMarca;
	@Resource
	private PersistenciaRubro persistenciaRubro;
	@Resource
	private PersistenciaSubrubro persistenciaSubrubro;
	@Resource
	private PersistenciaPresentacion persistenciaPresentacion;
	@Resource
	private PersistenciaLugarDePreparacion persistenciaLugarDePreparacion;
	
	@RequestMapping(method=RequestMethod.GET)
	public ModelAndView getConsulta(){
		return new ModelAndView("/abm/articulo/articuloComprado/consultaArticuloComprado");
	}
	
	@RequestMapping(value="/registrar", method=RequestMethod.GET)
	public ModelAndView getRegistroDeAlumno(){
		return new ModelAndView("/abm/articulo/articuloComprado/articuloComprado", "articuloComprado", new ArticuloComprado());
	}
	
	@RequestMapping(value="/registrarArticuloComprado", method=RequestMethod.GET)
	public void registrarAlumno(@Valid ArticuloComprado articuloComprado, BindingResult result, ServletOutputStream out) throws IOException{
		Result resultado = new Result();
		try{
			if(!result.hasErrors()){
				persistencia.save(articuloComprado);
				resultado.setSuccessful(true);
				crearFilaArticuloComprado(articuloComprado, resultado);
			}
		}
		finally{
			out.print(new JSONFormatter().format(resultado));
		}
	}
	
	@RequestMapping(value="/modificar", method=RequestMethod.GET)
	public ModelAndView getModificacionDeArticuloComprado(@RequestParam long id){
		ArticuloComprado articulo = persistencia.get(id);
		ModelAndView modeloYVista = new ModelAndView("/abm/articulo/articuloComprado/articuloComprado", "articuloComprado", articulo);
		modeloYVista.addObject("subrubros", persistenciaSubrubro.findAll());
		return modeloYVista;
	}
	
	@RequestMapping(value="/modificarArticuloComprado", method=RequestMethod.GET)
	public void modificarArticuloComprado(@Valid ArticuloComprado articuloComprado, BindingResult result, ServletOutputStream out) throws IOException{
		Result resultado = new Result();
		try{
			if(!result.hasErrors()){
				persistencia.update(articuloComprado);
				crearFilaArticuloComprado(articuloComprado, resultado);
				resultado.setSuccessful(true);
			}
		}
		finally{
			out.print(new JSONFormatter().format(resultado));
		}
	}
	
	@RequestMapping(value="/eliminarArticuloComprado", method=RequestMethod.GET)
	public void eliminarArticuloComprado(@RequestParam(value="id") long id, ServletOutputStream out) throws IOException{
		Result resultado = new Result();
		try{
			ArticuloComprado articuloComprado = persistencia.get(id);
			persistencia.remove(articuloComprado);
			resultado.setSuccessful(true);
		}
		finally{
			out.print(new JSONFormatter().format(resultado));
		}
	}
	
	@RequestMapping(value="/retornarSubrubros", method=RequestMethod.GET)
	public void getRubros(ServletOutputStream out, @RequestParam long idRubro) throws IOException{
        Result resultado = new Result();
        
        Rubro rubro = persistenciaRubro.get(idRubro);
        Iterable<Subrubro> subrubros = rubro.getSubrubros();
        for (Subrubro subrubro : subrubros)
            crearFilaSubrubro(subrubro, resultado);
        resultado.setSuccessful(true);
        out.print(new HTMLSelectFormatter().format(resultado));
	}
	
	@RequestMapping(value="/retornarArticulosComprados", method=RequestMethod.GET)
	public void getTodosLosArticulosComprados(ServletOutputStream out) throws IOException{
        Result resultado = new Result();
        
        List<ArticuloComprado> articulos = persistencia.findAll();
        for (ArticuloComprado articulo : articulos)
            crearFilaArticuloComprado(articulo, resultado);
        resultado.setSuccessful(true);
        out.print(new JSONFormatter().format(resultado));
	}
	
	@ModelAttribute("marcas")
    public Collection<Marca> getMarcas() {
	    return persistenciaMarca.findAll();
	}
	
	@ModelAttribute("rubros")
    public Collection<Rubro> getRubros() {
	    return persistenciaRubro.findAll();
	}
	
	@ModelAttribute("presentaciones")
    public Collection<Presentacion> getPresentaciones() {
	    return persistenciaPresentacion.findAll();
	}
	
	@ModelAttribute("lugaresDePreparacion")
    public Collection<LugarDePreparacion> getLugaresDePreparacion() {
	    return persistenciaLugarDePreparacion.findAll();
	}
	
	private void crearFilaSubrubro(Subrubro subrubro, Result resultado){
		Content contenido = resultado.getContent();
		Row fila = new Row();
        fila.add(subrubro.getId().toString());
        fila.add(subrubro.getNombre());
        contenido.add(fila);
	}
	
	private void crearFilaArticuloComprado(ArticuloComprado articulo, Result resultado){
		Content contenido = resultado.getContent();
        
		contenido.add(
				new Row()
		        .add(articulo.getId().toString())
		        .add(articulo.getNombre())
		        .add(articulo.getSubrubro().getNombre())
		        .add((articulo.getMarca() != null) ? articulo.getMarca().getNombre() : "")
	        );
	}
}
